package liczba;

class LiczbaEx extends Exception {
	static final long serialVersionUID=42;
	public LiczbaEx() {};
	public LiczbaEx(String str) { super(str); }
};

public class Liczba {
	private int n;
	Liczba() { n=0; }
	Liczba(int n) { this.n = n; }
	Liczba(String n, int podstawa) throws LiczbaEx  {
		if(podstawa<2 || podstawa >16) throw new LiczbaEx("zła podstawa");
		char cur;
		int pow;
		for(int i=0; i<n.length(); i++) {
			int j = n.length()-i;
			for(pow=1; j>1; j--) { pow *= podstawa; }
			cur = n.charAt(i);
			if(Character.isDigit(cur)) { 
				if((int)cur-48 >= podstawa) throw new LiczbaEx("zły znak: " + cur);
				else this.n += ((int)cur-48)*pow;
			}
			else if(Character.isUpperCase(cur)) {
				if((int)cur-55 >= podstawa) throw new LiczbaEx("zły znak: " + cur);
				else this.n += ((int)cur-55)*pow;
			} 
			else if(Character.isLowerCase(cur)) {
				if((int)cur-87 >= podstawa) throw new LiczbaEx("zły znak: " + cur);
				else this.n += ((int)cur-87)*pow;
			}
			else throw new LiczbaEx("zły znak: " + cur);
		}
	}
	public String zapis(int podstawa) throws LiczbaEx {
		if(podstawa<2 || podstawa >16) throw new LiczbaEx("zła podstawa");
		StringBuilder result = new StringBuilder();
		int holder=n;
		int maxPow=0;
		int curPow=podstawa;
		for( ; curPow<=n; curPow*=podstawa) { maxPow++; }
		curPow /= podstawa;
		for( ; maxPow>=0; maxPow--) {
			if(holder==0) result.append(0);
			else {
				int temp = holder/curPow;
				if(temp<10) result.append(temp);
				else result.append((char)(temp+55));
				holder -= temp*curPow;
			}
			curPow /= podstawa;
		}
		return result.toString();
	}
};
